class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        int l = nums.length;//数组长度
        Arrays.sort(nums);//对数组进行排序
        List<List<Integer>> lists = new ArrayList<List<Integer>>();
        //答案不能包含重复的三元组，所以在确定第一个数和第二个数的时候，要跳过数值一样的下标
        //（在三数之和确定的情况下，确保第一个数和第二个数不会重复，即可保证三元组不重复）
        for(int i = 0;i < l;i++) {
            if(i > 0 && nums[i] == nums[i - 1]) {
                //如果第i个数与前一个相同，就跳过这个循环,但不会使第一个不通过，做第一个基数是否存在过了
                continue;
            }
            int k = l - 1;
            int j = i + 1;
            while(j < k) {
                while (j > i + 1 && j < l && nums[j] == nums[j - 1]){
                    //与上面的判断i相同，判断j（第二个具基数）是否与前一个相同，但会使第一次通过（j > i + 1），否则j++
                   j++; 
                } 
                if (j >= k) {
                    //防止上一个判断第二基数j++加过头
                   break; 
                }
                int sum = nums[i] + nums[j] + nums[k];
                if (sum == 0) {
                    lists.add(Arrays.asList(nums[i], nums[j], nums[k]));
                    j++;
                } else if (sum > 0) {
                    k--;
                } else if (sum < 0) {
                    j++;
                }
            }
        }
        return lists;
    }
} 